/**
* @Copyright: Interactive Business Solution Pte Ltd, Singapore 版权声明
* @Author: 刘晓雄 2008-03-19  
* @Version: 080319.1
* 主要实现对客户端数据库上传结束的字段的更新，得到所有上传信息集合
*/
package com.ibsol.database
{
	import flash.data.SQLColumnSchema;
	import flash.data.SQLConnection;
	import flash.data.SQLSchemaResult;
	import flash.data.SQLStatement;
	import flash.data.SQLTableSchema;
	import flash.events.SQLErrorEvent;
	import flash.events.SQLEvent;
	import com.ibsol.database.DBConnManager;
	import mx.collections.ArrayCollection;
	
	public class TablesDAO
	{
		private var sqlCon:SQLConnection=null;
		
		public function TablesDAO(){
			sqlCon = DBConnManager.getConnection("tourix");
		}
		/**
		 * 得到本地数据库中所有的表
		 * @return Array 返回表集合
		 **/
		public function getAllTables():Array{
			sqlCon.loadSchema();
			var schemaResult:SQLSchemaResult=sqlCon.getSchemaResult();
			return schemaResult.tables;
		}
		/**
		 * 判断表中是否有offlineOperator字段，如果存在，调用getOOT方法进行筛选，否则，不进行筛选
		 * @param tableList 表集合
		 * @param updateTime 客户段最后更新时间
		 * @return Array 返回需要上传的数据集合
		 * */
		public function getofflineOperatorTable(tableList:Array):Array{
			var tabArr:Array=new Array();
			for(var i:int=0;i<tableList.length;i++){
				var flag:Boolean=false;
				var tbschema:SQLTableSchema=tableList[i] as SQLTableSchema;
				if(tbschema.name=="weather"||tbschema.name=="currency"){
					continue;
				}
				
				var columns:Array=tbschema.columns;
				//判断表中又没有offlineOperator列
				for(var j:int=0;j<columns.length;j++){
					var col:SQLColumnSchema=columns[j] as SQLColumnSchema;
					if(col.name=="offlineOperator"){
						flag=true;
						break;
					}
				}
				if(flag){
					getOOT(tbschema.name,function (arr:ArrayCollection):void{
						if(arr!=null&&arr.length!=0){
							//添加表名
							tabArr.push(tbschema.name);
							//添加筛选出来的集合
							tabArr.push(arr);
						}
					});
				}
				
			}
			return tabArr;
		}
		
		/**
		 * 对表进行筛选，条件是offlineOperator字段的值不能是''和'null' 并且更新时间必须大于客户端最新最新时间，更新时间不能为'null'
		 * @param tn 表名
		 * @param resultHandler 返回结果方程
		 * @param faultHandler 错误方程
		 **/
		private function getOOT(tn:String,resultHandler:Function,faultHandler:Function=null):void{
			var sqlState:SQLStatement=new SQLStatement();
			sqlState.sqlConnection=sqlCon;
			
			sqlState.text="select * from " + tn + " where (updateTime='T' and updateTime<>'' and ((offlineOperator not in('','DEL')) or (offlineOperator='DEL' and pairid<>'')))";
			sqlState.addEventListener(SQLEvent.RESULT,function (e:SQLEvent):void{
				resultHandler.call(this,toArrayCollection(sqlState.getResult().data));
			});
			sqlState.addEventListener(SQLErrorEvent.ERROR,faultHandler==null?onfaultHandler:faultHandler);
			sqlState.execute();
		}
		
		
		
		/**
		 * 修改本地数据库中上传表的offlineOperator字段的值 ，调用updateUpdateTime方法更新updateTime字段值
		 * DEL ----> 不删除  NEW、EDIT ----> 改成''
		 * @param arr 上传的数据集合
		 **/
		public function updateTables(arr:Array):void{
			for(var i:int=0;i<arr.length;i+=2){
				var tn:String=arr[i].toString();
				var ac:ArrayCollection=arr[i+1] as ArrayCollection;
				//存储有没有offlineOperator是NEW EDIT的纪录
				var count:int=0;
				var update:String="update "+tn+" set offlineOperator='' where id in(";
				var updateTime:String="update "+tn+" set updateTime='F' where id in(";
				for(var j:int=0;j<ac.length;j++){
					var o:Object=ac.getItemAt(j);
					updateTime+=o.id+",";
					if(o.offlineOperator=="NEW"||o.offlineOperator=="EDIT"){
						count++;
						update+=o.id+",";		
					}
				}
				var sqlState:SQLStatement=null;
				if(count>0){
					//去除最后一个的逗号
					update=update.substring(0,update.length-1);
					update+=")";
					sqlState=new SQLStatement();
					sqlState.sqlConnection=sqlCon;
					sqlState.text=update;
					sqlState.addEventListener(SQLErrorEvent.ERROR,onfaultHandler);
					sqlState.addEventListener(SQLEvent.RESULT,function (e:SQLEvent):void{
						trace("更新offlineOperator成功");
					});
					sqlState.execute();
				}
				updateTime=updateTime.substring(0,updateTime.length-1);
				updateTime+=")";
				updateUpdateTime(updateTime);
			}	
		}
		
		/**
		 *修改ｕｐｄａｔｅＴｉｍｅ字段 ,上传后所有数据的更新时间为最新更新时间
		 * @param sql 更新时间的sql语句
		 **/
		public function updateUpdateTime(sql:String):void{
			var sqlState:SQLStatement=new SQLStatement();
			sqlState.sqlConnection=sqlCon;
			sqlState.text=sql;
			sqlState.addEventListener(SQLErrorEvent.ERROR,onfaultHandler);
			sqlState.addEventListener(SQLEvent.RESULT,function (e:SQLEvent):void{
				trace("更新updateTime成功");
			});
			sqlState.execute();
		}
		
		/**
		 *自动设置pairid字段，存放在ａｒｒａｙ中　，不进行修改 
		 *只有是offlineOperator--->　NEW　的时候才更新pairid字段 
		 * @param arr 上传的数据集合
		 * @param companyid 公司编号
		 * @param userAcc 当前用户名
		 * @return ArrayCollection 返回需要修改pairid的集合
		 **/
		 public function setPairid(arr:Array,companyid:int,userAcc:String):ArrayCollection{
		 	var pairAc:ArrayCollection=new ArrayCollection();
		 	for(var i:int=0;i<arr.length;i+=2){
				var tn:String=arr[i].toString();
				var ac:ArrayCollection=arr[i+1] as ArrayCollection;
				//存储有没有offlineOperator是NEW的纪录
				var acNew:ArrayCollection=new ArrayCollection();
				for(var j:int=0;j<ac.length;j++){
					var o:Object=ac.getItemAt(j);
					if(o.offlineOperator=="NEW"){
						o.pairid=companyid.toString()+"_"+userAcc+"_"+o.id;
						acNew.addItem(o);	
					}
				}
				if(acNew!=null&&acNew.length!=0){
					pairAc.addItem(tn);
					pairAc.addItem(acNew);
				}
		 	}
		 	return pairAc;
		 }
		 
		 /**
		 * 服务器端返回成功后，　更新ｐａｉｒｉｄ字段
		 * @param ac 需要修改pairid字段的集合
		 **/
		 public function updatePairid(ac:ArrayCollection):void{
		 	for(var i:int=0;i<ac.length;i+=2){
		 		var tn:String=ac.getItemAt(i).toString();
		 		var acTemp:ArrayCollection=ac.getItemAt(i+1) as ArrayCollection;
		 		if(acTemp!=null&&acTemp.length!=0){
		 			for(var j:int=0;j<acTemp.length;j++){
		 				var ob:Object=acTemp.getItemAt(j) as Object;
						var sqlState:SQLStatement=new SQLStatement();
						sqlState.sqlConnection=sqlCon;
						sqlState.text="update "+tn+" set pairid='"+ob.pairid+"' where id="+ob.id;
						sqlState.addEventListener(SQLEvent.RESULT,function (e:SQLEvent):void{
							trace("表"+tn+"id="+ob.id+"更新ｐａｉｒｉｄ成功");
						});	
						sqlState.addEventListener(SQLErrorEvent.ERROR,onfaultHandler);
						sqlState.execute();
		 			}
		 		}
		 	}
		 }
		
		/**
		 *将ARRAY转换成ARRAYCOLLECTION
		 * @array Array集合
		 * @ArrayCollection 转换后的集合 
		 **/
		private function toArrayCollection(array:Array):ArrayCollection{
			if(array==null)
				return new ArrayCollection();
			var ac:ArrayCollection=new ArrayCollection();
			for(var i:int;i<array.length;i++){
				ac.addItem(array[i]);
			}
			return ac;
		}
		
		/**
		 * 错误处理函数
		 * @param e SQLErrorEvent事件
		 **/
		private function onfaultHandler(e:SQLErrorEvent):void{
			trace("TableDAO中出错:"+e.text);
		}
	}
}